package ua.diploma.registration;

import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;

import org.apache.log4j.Logger;

import ua.diploma.core.PasswordEncryptor;
import ua.diploma.hibernate.dao.DAOFactory;
import ua.diploma.hibernate.dto.User;
import ua.diploma.core.Constants.AccoutStaus;

/**
 * Реализация сервиса регистрации
 * 
 * @author netstalk3r
 * 
 */
public class RegistrationServiceImpl implements RegistrationService {

	/**
	 * логгер
	 */
	private static final Logger log = Logger
			.getLogger(RegistrationServiceImpl.class);

	/**
	 * Конструктор по умолчанию
	 */
	public RegistrationServiceImpl() {
		super();
	}

	@Override
	public void registerUser(User user) throws RegistrationException {
		log.info("Регистрация пользователя.");
		try {
			PasswordEncryptor encryptor =  new PasswordEncryptor();
			// шифруем пароль и задаем хешь для активации
			user.setPassword(encryptor.encrypt(user.getPassword()));
			final String activationHash = encryptor.encrypt(user
					.getEmail()) + encryptor.encrypt(user.getLogin());
			user.setActivationHash(activationHash);
			// добавляем юзера в базу
			DAOFactory.getUserDAO().addUser(user);
			/**
			 * Вот тут отправка на мыло
			 */
			log.info("Пользователь зарегестрирован.");
		} catch (SQLException e) {
			log.error("Ошибка работы с БД", e);
			throw new RegistrationException("Ошибка работы с БД");
		} catch (NoSuchAlgorithmException e) {
			log.error("Не удалось зашифровать", e);
		}
	}

	@Override
	public User activateAccount(String activationHash)
			throws ActivationException {
		log.info("Активация пользователя.");
		User user = null;
		try {
			user = DAOFactory.getUserDAO().getUserByActivationHash(
					activationHash);
			if (user == null) {
				throw new ActivationException(
						"Активация незарегестрированного пользователя.");
			}
			AccoutStaus status = AccoutStaus.fromValue(user.getStatus());
			if (status.equals(AccoutStaus.CONFIRMED.getValue())) {
				throw new ActivationException(
						"Активация активированного пользователя.");
			}
			user.setStatus(AccoutStaus.CONFIRMED.getValue());
			DAOFactory.getUserDAO().updateUser(user);
			log.info("Активация успешна.");
		} catch (SQLException e) {
			log.error("Ошибка работы бд", e);
			throw new ActivationException("Ошибка работы с БД");
		}
		return user;
	}

	@Override
	public User getUserByEmail(String email) {
		User user = null;
		try {
			user = DAOFactory.getUserDAO().getUserByEmail(email);
		} catch (SQLException e) {
			log.error("Ошибка работы с БД", e);
			return null;
		}
		return user;
	}

	@Override
	public User getUserByLogin(String login) {
		User user = null;
		try {
			user = DAOFactory.getUserDAO().getUserByLogin(login);
		} catch (SQLException e) {
			log.error("Ошибка работы с БД", e);
			return null;
		}
		return user;
	}

}
